home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 6 / CU Amiga Magazine's Super CD-ROM 06 (1996)(EMAP Images)(GB)(Track 1 of 4)[!][issue 1997-01].iso / cucd / online / fidonetts / 3bcsrc.lzh / 3viewpkt.c < prev    next >
C/C++ Source or Header  |  1993-03-20  |  5KB  |  214 lines

  1. /*
  2.  * dummied-up type 3 binary packet tosser demo (a "viewer," actually)
  3.  * displays contents of packet ("3PAKT000.000" default) to screen.
  4.  * Public Domain from M. Kimes
  5.  */
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include "3binary.h"
  12.  
  13. #define NUMTYPES 28
  14. char *typenames[] = {"EOP:      ","FROM:     ","TO:       ","SUBJECT:  ",
  15.                      "ID:       ","REF:      ","DATE:     ","ATTRIB:   ",
  16.                      "PASSWORD: ","PRODUCT:  ","ECHO:     ","MSG:      ",
  17.                      "TEXT:     ","ORIG:     ","ORIGID:   ","FONT:     ",
  18.                      "CHARSET:  ","RICH:     ","SUB:      ","GROUP:    ",
  19.                      "ATTACH:   ","DEST:     ","QUOTE:    ","GLOBAL:   ",
  20.                      "ENCRYPT:  ","ADD:      ","DROP:     ","REPORT:   "};
  21.  
  22.  
  23. void process_unknown_chunk3(FILE *handle,USHORT type,long chunklen,int *error) {
  24.  
  25.   /* handle unknown master chunks here */
  26.  
  27.   printf("\n\n ***Unknown chunk #%d  Len %ld ignored...\n",type,chunklen);
  28. }
  29.  
  30.  
  31. void end_3bmsg (void *priv,CHUNK3 *pkt3,CHUNK3 *msg3,CHUNK3 *globals) {
  32.  
  33.   /* dummy "callback" function; we don't need it for these purposes */
  34. }
  35.  
  36.  
  37. void show_text (char *text,SHORT dlen,int trans) {
  38.  
  39.   register SHORT len = dlen;
  40.   register char *p = text;
  41.  
  42.   if(trans) {
  43.     while(*p && len) {
  44.       fputc(*p,stdout);
  45.       if(*p == '\r')
  46.         fputc('\n',stdout);
  47.       p++;
  48.       len--;
  49.     }
  50.   }
  51.   else {
  52.     while(len) {
  53.       if(isprint(*p))
  54.         fputc(*p,stdout);
  55.       else
  56.         printf("[%02hX]",*p);
  57.       p++;
  58.       len--;
  59.     }
  60.   }
  61. }
  62.  
  63.  
  64. void show_data (char *data,SHORT len,SHORT type) {
  65.  
  66.   switch(type) {
  67.     case TEXT3:
  68.       fputc('\n',stdout);
  69.       show_text(data,len,1);
  70.       break;
  71.  
  72.     case ID3:
  73.       printf("%08lx",*(long *)data);
  74.       break;
  75.  
  76.     case REF3:
  77.       printf("%08lx",*(long *)data);
  78.       show_text(data + 4,len - 4,0);
  79.       break;
  80.  
  81.     case ENCRYPT3:
  82.     case QUOTE3:
  83.       show_text(data + sizeof(SHORT),*(SHORT *)data,0);
  84.       fputc('\n',stdout);
  85.       show_text(data + (*(SHORT *)data) + sizeof(SHORT) + (*(SHORT *)data %
  86.                 sizeof(SHORT)) + sizeof(SHORT), *(SHORT *)data +
  87.                 (*(SHORT *)data) + sizeof(SHORT) + (*(SHORT *)data %
  88.                 sizeof(SHORT)), 1);
  89.       break;
  90.  
  91.     case ATTRIB3:
  92.       {
  93.         int x;
  94.  
  95.         for(x = 0;x < 32;x++)
  96.           fputc((*(long *)data & (1 << x)) ? '+' : '-',stdout);
  97.       }
  98.       break;
  99.  
  100.     case DATE3:
  101.       if((*(BINDATE3 *)data).year) {
  102.         printf("%4u/%02hu/%02hu %02hu:%02hu:%02hu",
  103.                (*(BINDATE3 *)data).year,(*(BINDATE3 *)data).mon,
  104.                (*(BINDATE3 *)data).mday,(*(BINDATE3 *)data).hour,
  105.                (*(BINDATE3 *)data).min,(*(BINDATE3 *)data).sec);
  106.         if((*(BINDATE3 *)data).gmtoff != -32767)
  107.           printf(" %d",(*(BINDATE3 *)data).gmtoff);
  108.       }
  109.       break;
  110.  
  111.     default:
  112.       show_text(data,len,0);
  113.       break;
  114.   }
  115.   fflush(stdout);
  116. }
  117.  
  118.  
  119. int import_3bmsg (void *dummy,CHUNK3 *pkt3,CHUNK3 *msg3,CHUNK3 *globals,
  120.                   long msglen,int *error) {
  121.  
  122.   /*
  123.    * this function is called to import/forward the message
  124.    * this version of it just displays the contents of the message
  125.    * doesn't interact with every damned type available (for
  126.    * instance, insists on either a TO chunk (netmail) and/or an ECHO
  127.    * chunk; doesn't allow for GROUP chunk...
  128.    */
  129.  
  130.   static long      nummsgs = 0L;
  131.   register CHUNK3 *info;
  132.  
  133.   *error = NOERR3;
  134.   printf("\n\n ***Msg #%ld  Len %ld:\n",++nummsgs,msglen);
  135.  
  136.   info = globals;
  137.   while(info) {
  138.     fputs("\n **Global ",stdout);
  139.     if(info->type < NUMTYPES)
  140.       fputs(typenames[info->type],stdout);
  141.     else
  142.       printf(" UNKNOWN (%d):  ",info->type);
  143.     if(info->len)
  144.       show_data((char *)info->data,info->len,info->type);
  145.     info = info->next;
  146.   }
  147.   info = msg3;
  148.   while(info) {
  149.     fputs("\n **Msg ",stdout);
  150.     if(info->type < NUMTYPES)
  151.       fputs(typenames[info->type],stdout);
  152.     else
  153.       printf(" UNKNOWN (%d):  ",info->type);
  154.     if(info->len)
  155.       show_data((char *)info->data,info->len,info->type);
  156.     info = info->next;
  157.   }
  158.   fflush(stdout);
  159.  
  160.   return 0;
  161. }
  162.  
  163.  
  164. int check_3bpkthdr (void *dummy,char *fname,CHUNK3 *pkt3,CHUNK3 *globals,
  165.                     long hdrlen,int *error) {
  166.  
  167.   /*
  168.    * this "callback" function should check packet header and decide
  169.    * if you want to process the packet.  return 0 if so, anything
  170.    * else if not.
  171.    */
  172.  
  173.   register CHUNK3 *info;
  174.  
  175.   *error = NOERR3;
  176.   printf("\n\n ***Pkt Hdr  Len %ld:\n",hdrlen);
  177.   info = pkt3;
  178.   while(info) {
  179.     fputs("\n **Pkt ",stdout);
  180.     if(info->type < NUMTYPES)
  181.       fputs(typenames[info->type],stdout);
  182.     else
  183.       printf(" UNKNOWN (%d):  ",info->type);
  184.     if(info->len)
  185.       show_data((char *)info->data,info->len,info->type);
  186.     info = info->next;
  187.   }
  188.   fflush(stdout);
  189.  
  190.   return 0;
  191. }
  192.  
  193.  
  194.  
  195. int main (int argc,char *argv[]) {
  196.  
  197.   int   error;
  198.   char *pname = "3PAKT000.000";
  199.  
  200.   if(argc > 1)
  201.     pname = argv[1];
  202.  
  203.   printf("\n3VIEWPKT    type 3binary packet viewer example\n");
  204.   printf("\n\n\n ****\"Processed\" %ld msgs\n",
  205.          process_pkt3(NULL,pname,&error));
  206.  
  207.   if(error != NOERR3) {
  208.     error3(error);
  209.     printf("\nUsage:  3VIEWPKT [3binary packet name, default 3PAKT000.000]\n");
  210.   }
  211.  
  212.   return error;
  213. }
  214.